/**
 * 字符串与数字转换工具类
 * 核心能力：
 * 1. 字符串转数字（处理空值、非数字字符、小数、科学计数法）
 * 2. 数字转字符串（保留小数、补零、千分位、科学计数法转普通格式）
 * 3. 特殊转换（金额/进制/中文数字）
 * 适配：UniApp 全端（无浏览器专属 API 依赖）
 */
const StringUtils = {
    // ====================== 1. 字符串转数字（核心场景） ======================
    /**
     * 字符串转整数（支持容错，默认返回0）
     * @param {String|Number} str - 待转换值（如 '123'、'123abc'、null、undefined）
     * @param {Number} defaultValue - 转换失败默认值（默认 0）
     * @returns {Number} 转换后的整数（NaN 时返回默认值）
     * @example
     * parseInt('123') → 123
     * parseInt('123.45') → 123（自动取整）
     * parseInt('abc') → 0（默认值）
     */
    parseInt(str, defaultValue = 0) {
        // 先处理 null/undefined/空字符串
        if (str === null || str === undefined || str === "") {
            return defaultValue;
        }
        // 若已是数字，直接取整
        if (typeof str === "number") {
            return Math.floor(str);
        }
        // 字符串处理：提取开头的数字部分（支持负号）
        const match = String(str).match(/^-?\d+/);
        return match ? parseInt(match[0], 10) : defaultValue;
    },

    /**
     * 字符串转小数（支持容错，默认返回0）
     * @param {String|Number} str - 待转换值（如 '123.45'、'123.45abc'、'3.14e2'）
     * @param {Number} defaultValue - 转换失败默认值（默认 0）
     * @returns {Number} 转换后的小数（NaN 时返回默认值）
     * @example
     * parseFloat('123.45') → 123.45
     * parseFloat('3.14e2') → 314（科学计数法转普通小数）
     * parseFloat('abc.123') → 0（默认值）
     */
    parseFloat(str, defaultValue = 0) {
        if (str === null || str === undefined || str === "") {
            return defaultValue;
        }
        if (typeof str === "number") {
            return str;
        }
        // 提取合法小数（支持负号、科学计数法，如 -123.45e-2 → -1.2345）
        const num = parseFloat(String(str));
        return isNaN(num) ? defaultValue : num;
    },

    /**
     * 字符串转数字（自动判断整数/小数，支持容错）
     * @param {String|Number} str - 待转换值
     * @param {Number} defaultValue - 转换失败默认值（默认 0）
     * @returns {Number} 转换后的数字
     * @example
     * parseNum('123') → 123（整数）
     * parseNum('123.45') → 123.45（小数）
     */
    parseNum(str, defaultValue = 0) {
        const num = this.parseFloat(str, defaultValue);
        // 判断是否为整数（无小数部分）
        return Number.isInteger(num) ? Math.floor(num) : num;
    },

    // ====================== 2. 数字转字符串（核心场景） ======================
    /**
     * 数字转字符串（保留指定小数位，默认2位，四舍五入）
     * @param {Number|String} num - 待转换数字（如 123、123.456、'123.45'）
     * @param {Number} decimalLen - 保留小数位数（默认 2，0 则取整）
     * @param {String} defaultValue - 转换失败默认值（默认 '0.00'）
     * @returns {String} 格式化后的字符串
     * @example
     * parseString(123.456, 2) → '123.46'（四舍五入）
     * parseString(123, 0) → '123'（整数）
     * parseString('abc', 2) → '0.00'（默认值）
     */
    parseString(num, decimalLen = 2, defaultValue = "0.00") {
        // 先将输入转为数字
        const originNum = this.parseFloat(num);
        if (isNaN(originNum)) {
            return defaultValue;
        }
        // 处理小数位数（最小0，最大10，避免极端情况）
        const len = Math.max(0, Math.min(10, decimalLen));
        // 四舍五入并补零（toFixed 会自动补零）
        return originNum.toFixed(len);
    },

    /**
     * 数字转字符串（去掉末尾多余的0和小数点）
     * @param {Number|String} num - 待转换数字（如 123.00、123.40、'123.0'）
     * @param {String} defaultValue - 转换失败默认值（默认 '0'）
     * @returns {String} 简化后的字符串
     * @example
     * deleteZero(123.00) → '123'
     * deleteZero(123.40) → '123.4'
     * deleteZero(123.4500) → '123.45'
     */
    deleteZero(num, defaultValue = "0") {
        const str = this.parseString(num, 10, defaultValue); // 先保留10位小数，避免丢失有效数字
        if (str === defaultValue) {
            return str;
        }
        // 去掉末尾的0和小数点（如 '123.4000' → '123.4'，'123.0000' → '123'）
        return str.replace(/(\.0*$)|(0+$)/, "").replace(/\.$/, "");
    },
    empty(target,defaultValue = '') {
    if (target === null || target === undefined || target.length === 0) {
        return defaultValue;
    }
    return target;
  }
};

// 导出工具类（支持全局引入或按需引入）
export default StringUtils;
